package com.scene.q1_Basic;

public class BasicGrammarKeyword {
    public static void main(String[] args) {
        // final 示例
        finalExample();

        // finally 示例
        finallyExample();

        // finalize 示例
        finalizeExample();
    }

    // final 关键字示例
    private static void finalExample() {
        System.out.println("\n=== final 示例 ===");

        final int finalVar = 10; // final变量必须初始化且不能修改
        // finalVar = 20; // 编译错误，不能修改final变量

        final Person person = new Person("Alice");
        // person = new Person("Bob"); // 编译错误，不能修改final引用
        person.setName("Alice Smith"); // 但可以修改对象内部状态

        System.out.println("final变量: " + finalVar);
        System.out.println("final引用对象: " + person.getName());
    }

    // finally 块示例
    private static void finallyExample() {
        System.out.println("\n=== finally 示例 ===");

        try {
            System.out.println("try块开始");
            int result = 10 / 2; // 正常执行
            // int result = 10 / 0; // 抛出异常
            System.out.println("计算结果: " + result);
        } catch (ArithmeticException e) {
            System.out.println("捕获到算术异常: " + e.getMessage());
        } finally {
            System.out.println("finally块 - 这部分代码总是会执行");
            // 通常用于释放资源，如关闭文件、数据库连接等
        }
    }

    // finalize 方法示例
    private static void finalizeExample() {
        System.out.println("\n=== finalize 示例 ===");

        Person p = new Person("Tom");
        p = null; // 使对象成为垃圾回收候选

        // 建议JVM进行垃圾回收（不保证立即执行）
        System.gc();

        System.out.println("已建议垃圾回收，finalize()方法可能被调用");
    }
}

// 用于演示final和finalize的类
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // final方法，不能被子类重写
    public final void finalMethod() {
        System.out.println("这是一个final方法");
    }

    // finalize方法示例
    @Override
    protected void finalize() throws Throwable {
        System.out.println("Person对象(" + name + ")正在被垃圾回收...");
        super.finalize();
    }
}
